<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
  <link href="https://gmpg.org/xfn/11" rel="profile">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="Hugo 0.68.3" />

  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>我的博客</title>
  <meta name="description" content="这里是田帅康的个人博客" />

  
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/print.css" media="print">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/poole.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/syntax.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/hyde.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700">


  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="/favicon.png">

  
  <link href="/my_technology_blog/index.xml" rel="alternate" type="application/rss+xml" title="我的博客" />
  
</head>

  <body class="theme-base-0self ">
  <aside class="sidebar">
  <div class="container sidebar-sticky">
    <div class="sidebar-about">
      <a href="/my_technology_blog/"><h1>我的博客</h1></a>
      <p class="lead">
       这里是田帅康的个人博客 
      </p>
    </div>

    <nav>
      <ul class="sidebar-nav">
        <li><a href="/my_technology_blog/">Home</a> </li>
        
      </ul>
    </nav>

    <p>&copy; 2020. All rights reserved. </p>
  </div>
</aside>

    <main class="content container">
    <div class="posts">
<article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/ten/">第八篇文章</a>
  </h1>
  <time datetime="2020-04-12T00:00:00Z" class="post-date">Sun, Apr 12, 2020</time>
  MongoDB概念解析 MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品，
是非关系数据库当中功能最丰富，最像关系型数据库的。
MongoDB是开源，高性能的NoSQL数据库，支持索引、集群、复制和故障转移、各种语言的驱动程序丰富；
MongoDB 是由C++语言编写的，是一个基于分布式文件存储的开源数据库系统。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档，数据结构由键值(key=&gt;value)对组成。 MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档，数组及文档数组。 MongoDB默认把_id设置为主键（_开头的键是保留的）
数据库名必须为小写
RDBMS与MongoDB对应的术语比较 需注意 文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串，还可以是其他几种数据类型（甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况，键可以使用任意UTF-8字符。
文档 文档是一个键值（key-value）对（即BSON）。MongoDB的文档不需要设置相同的字段，并且相同的字段也不要求相同的类型。
这是和关系型数据库的重大区别，也是MongoDB非常突出的特点。
集合 集合就是 MongoDB 文档组，类似于 RDBMS （关系数据库管理系统：Relational Database Management System)中的表格。
集合存在于数据库中，集合没有固定的结构，这意味着你在对集合可以插入不同格式和类型的数据，
但通常情况下我们插入集合的数据都会有一定的关联性。
capped collections 固定大小的集合 MongoDB数据类型 
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/kon/">第七篇文章</a>
  </h1>
  <time datetime="2020-04-11T00:00:00Z" class="post-date">Sat, Apr 11, 2020</time>
  python操作SQL pymsql是Python中操作MySQL的模块，其使用方法和MySQLdb几乎相同
一、下载安装 pip3 install pymysql 二、操作使用 1、执行SQL
 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 # 创建连接 6 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') 7 # 创建游标 8 cursor = conn.cursor() 9 10 # 执行SQL，并返回收影响行数 11 effect_row = cursor.execute(&quot;update hosts set host = '1.1.1.2'&quot;) 12 13 # 执行SQL，并返回受影响行数 14 #effect_row = cursor.execute(&quot;update hosts set host = '1.1.1.2' where nid &gt; %s&quot;, (1,)) 15 16 # 执行SQL，并返回受影响行数 17 #effect_row = cursor.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/kon/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/tan/">个人简历</a>
  </h1>
  <time datetime="2020-04-09T00:00:00Z" class="post-date">Thu, Apr 9, 2020</time>
  基本信息  田帅康 1996年2月
Python全栈开发工程师
3年工作经验
手机号：17554195670
邮箱：1216124438@qq.com个人网站：http://tian_kang_kang.gitee.io/my_technology_blog/ 个人优势  三年 Python 全栈开发经验，掌握 Django 框架，作为开发工程师参与设计与开发过多个项目， 精通django框架，精通API接口开发，熟练Scrapy框架，熟悉Mysql，Redis,Mongodb等数据库，熟悉VUE前端开发，掌握flask框架。有优秀的学习能力和团队沟通能力，经常与团队进行技术分享，能与团队共同成长。
 教育经历  武汉工程科技学院
计算机科学与技术 | 本科
 求职意向  期望职位：Python全栈工程师
期望薪资：面议
工作地区：（国内即可）
目前状况：离职（可立即到岗）
 工作经历  北京新锐泰乐科技有限公司Python全栈开发工程师
北京优企信科科技有限公司Python初级开发工程师
 项目经历  美多商城 项目架构：Django+Vue+Mysql+Redis+Mongodb
项目描述： 本项目使用Django+Vue开发。采用前后端分离式开发，易于维护，扩展等。同时使用了Mysql，Redis，Mongo等三大数据库，能够更好的存储用户数据，缓解数据库压力。增强了开发人员的开发效率。项目使用国际化语言插件，支持检索功能快速定位产品，实时更新商品数据，支持三方登录。使用户能够更好浏览商城和购买商品，大大增强了用户体验。
项目职责： 1，使用Django框架操作后端接口，维护和实时更新后端数据。后端支持用户第三方登录，可以使用户更好的方便登录，加入JWT令牌机制，更好的保护了用户数据
2，将商品图片，小视频等上传到七牛云存储。
技术难点： 前后端分离，后端向前端传送数据需要跨域，实现第三方登录和三方支付接口。后端使用JWT令牌，保护用户信息。
 车型车系品牌管理App 项目架构：Django+Scrapy+Vue+Mysql+Redis+Mongodb
项目描述： 实时更新最新的车辆信息，运用协同过滤算法推荐用户喜欢的车辆类型，通过搜索的车辆信息实现性价对比，帮助用户更快更方便的购买汽车
项目职责： 1.主要用scrapy框架定时从各大汽车网站爬取车辆信息，对数据进行清洗。
2.实现增量式爬虫，研究一些反爬策略
技术难点： 1.频繁的爬取数据IP地址被封，构造自己的IP池，每次访问随机选择代理。
2.Cookie限制，使用Selenium模块模拟浏览器行为进行爬取。
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/pon/">第五篇文章</a>
  </h1>
  <time datetime="2020-04-09T00:00:00Z" class="post-date">Thu, Apr 9, 2020</time>
  Django模型关系OneToOneField（一对一）  数据库中的数据表之间的关系包括一对一，一对多，多对多，它们分别使用关键字OneToOneField,ForeignKey,ManyToManyFiled进行定义，之前已经写了一对多，多对多介绍以及使用，准备再找一个时间写一下它们之间的一个区别，这三种关系中比较让你不好理解的可能就是一对一和一对多的区别了，暂时按下不表
首先还是举一个比较常见的一对一的关系：银行账户(Account)和联系人(Contact)，一个银行账户对应一个联系人，而一个联系人也只对应一个账户
在models.py创建数据模型： 这里创建了两个数据模型一个是Account(账户）里面包含三个属性username,password,register_date，另外一个是Contact（联系人）包含了四个属性，address(联系人地址)，code(邮编)，mobile(联系人手机)以及关联两张表的外键account
OneToOneField的第一个参数是被关联的模型的名称，第二个参数表示级联删除，这个已经在之前的博客里面讲过了，当Account数据表里面的数据被删除后Contact里面的数据也随着被删除 接下来执行数据迁移命令，并查看sql语句：
那么一对一关系中如何进行对数据的操作，现在在python shell中进行演示：
这里主要进行的数据的添加和在一对一关系中如何正向查询和反向查询
数据添加操作:
 from blog.models import Account,Contact a1 = Account.objects.create(username='leeyongbard',password='123') a1.save() c1 = Contact.objects.create(address='zh',code='45000',mobile='15735896033',account=a1) c1.save() 数据表如下:
查询操作：
正向查询：通过账户查询对应的联系人的信息
 a1.contact.address a1.contact.code 反向查询通过联系人查询账户信息：
删除操作:
删除账户信息，则对应的联系人信息也会被删除:
a1.contact.delete()
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/tno/">第六篇文章</a>
  </h1>
  <time datetime="2020-04-09T00:00:00Z" class="post-date">Thu, Apr 9, 2020</time>
  Redis Redis的基本数据类型：
1.String（字符串）
2.Hash（哈希）
3.List（列表）
4.Set（集合）
5.Zset（有序集合）
String： string是redis的最基本数据类型，key-value格式，实际上是一个数据结构服务器，支持不同类型的值（二进制字符串，链表，集合，哈希表，等等）
首先用Set和Get进行存储和取出
INCR指令
将字符串值解析成整型，将其加一，最后将结果保存为新的字符串值
mset，mget
一次存放多个值，一次取出多个值 Del删除键的值（删除成功返回1否则返回0），Exists查询键值是否存在（存在则返回1不凡则0）
Type查询类型
Expire：设置Key的存活时间
List： Redis列表是简单的字符串列表，按照插入顺序排序。你可以添加一个元素到列表的头部（左边）或者尾部（右边）
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
lpush:从左边插入，rpush:从右边插入，lrange，遍历一定范围的值，从左边开始为0，负数代表从尾部象前数
Hash： Redis hash 是一个string类型的field和value的映射表，hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对（40多亿）
Hash 便于表示 objects，实际上，你可以放入一个 hash 的域数量实际上没有限制（除了可用内存以外）。所以，你可以在你的应用中以不同的方式使用 hash。
HMSET 指令设置 hash 中的多个域，而 HGET 取回单个域。HMGET 和 HGET 类似，但返回一系列值：
Set: Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据
Redis 中集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
  
  <div class="read-more-link">
    <a href="/my_technology_blog/tno/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/tne/">第四篇文章</a>
  </h1>
  <time datetime="2020-04-09T00:00:00Z" class="post-date">Thu, Apr 9, 2020</time>
  python垃圾回收机制 引用计数 1）当一个对象的引用被创建或者复制时，对象的引用计数加1；当一个对象的引用被销毁时，对象的引用计数减1
2）当对象的引用计数减少为0时，就意味着对象已经再没有被使用了，可以将其内存释放掉。
标记清除 1）它分为两个阶段：第一阶段是标记阶段，GC会把所有的活动对象打上标记，第二阶段是把那些没有标记的对象非活动对象进行回收。
2）对象之间通过引用（指针）连在一起，构成一个有向图
3）从根对象（root object）出发，沿着有向边遍历对象，可达的（reachable）对象标记为活动对象，不可达的对象就
是要被清除的非活动对象，根对象就是全局变量、调用栈、寄存器。
分代回收  分代回收是建立在标记清除技术基础之上的，是一种以空间换时间的操作方式。 Python将内存分为了3“代”，分别为年轻代（第0代）、中年代（第1代）、老年代（第2代） 他们对应的是3个链表，它们的垃圾收集频率与对象的存活时间的增大而减小。 新创建的对象都会分配在年轻代，年轻代链表的总数达到上限时，Python垃圾收集机制就会被触发
5.老年代中的对象是存活时间最久的对象，甚至是存活于整个系统的生命周期内  GIL: 全局解释器锁（英语：Global Interpreter Lock，缩写GIL），
是计算机程序设计语言解释器用于同步线程的一种机制，它使得任何时刻仅有一个线程在执行。
即便在多核心处理器上，使用 GIL 的解释器也只允许同一时间执行一个线程。
1）为了解决不同线程同时访问同一资源时，数据保护问题，而产生了GIL
2）GIL在解释器的层面限制了程序在同一时间只有一个线程被CPU实际执行，而不管你的程序里实际开了多少条线程
3）为了解决这个问题，CPython自己定义了一个全局解释器锁，同一时间仅仅有一个线程可以拿到这个数据
4）python之所以会产生这种不好的状况是因为python启用一个线程是调用操作系统原生线程，就是C接口
悲观锁和乐观锁 乐观锁不是数据库自带的，需要我们自己去实现。乐观锁是指操作数据库时(更新操作)，想法很乐观，
认为这次的操作不会导致冲突，在操作数据时，并不进行任何其他的特殊处理（也就是不加锁），
而在进行更新后，再去判断是否有冲突了。
悲观锁 每次去拿数据的时候都认为别人会修改，所以每次在拿数据的时候都会上锁，
这样别人想拿这个数据就会block直到它拿到锁
MySQL 索引是什么 索引是对数据库中一或多个列值的排序，帮助数据库高效获取数据的数据结构
4个索引类型： 普通索引 、唯一索引、主键索引 、全文索引
索引优点 （1）加快检索速度。
（2）唯一索引确保每行数据的唯一性
（3）在使用索引的过程可以优化隐藏器，提高系统性能
索引缺点 （1）插入删除 修改 维护速度下降
（2）占用物理和数据空间
1. InnoDB事务原理  事务（Transaction）是数据库区别于文件系统的重要特性之一，
事务会把数据库从一种一致性状态转换为另一种一致性状态。 在数据库提交时，可以确保要么所有修改都已保存，要么所有修改都不保存。  2. 事务的四大特征（ACID）  原子性(Atomicity)：整个事物的所有操作要么全部提交成功，要么全部失败回滚(不会出现部分执行的情况)。 一致性(Consistency)：几个并行执行的事务，其执行结果必须与按某一顺序串行执行的结果相一致。 隔离性(Isolation)：事务的执行不受其他事务的干扰，事务执行的中间结果对其他事务必须是透明的。 持久性(Durability): 一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，
即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。  并发带来的影响 1.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/tne/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/and/">第三篇文章</a>
  </h1>
  <time datetime="2020-04-08T00:00:00Z" class="post-date">Wed, Apr 8, 2020</time>
  进程 线程 协程 进程，是执行中的计算机程序。也就是说，每个代码在执行的时候，首先本身即是一个进程 一个进程具有:就绪，运行，中断，僵死，结束等状态(不同操作系统不一样)
并行 同一个CPU上，可以运行多个进程，由操作系统来自动分配时间片
由于进程间资源不能共享，需要进程间通信，来发送数据，接受消息等 多进程，也称为“并行”
进程间通信 进程彼此之间互相隔离，要实现进程间通信（IPC）
multiprocessing模块支持两种形式：队列和管道
进程池 概念上来理解： 在Python中，拥有着独特的进程生成器：进程池。当进程足够多，已经多到无法人为去手动创建时，进程池就被应运而生
使用多进程是为了并发，通常有几个cpu核心就开几个进程，但是进程开多了会影响效率， 主要体现在切换的开销，所以引入进程池限制进程的数量。
线程 线程，是在进程中执行的代码。
一个进程下可以运行多个线程，这些线程之间共享主进程内申请的操作系统资源。 特性: 线程，必须在一个存在的进程中启动运行
进程和线程的区别 一个进程中的各个线程与主进程共享相同的资源，与进程间互相独立相比，线程之间信息共享和通信更加容易(都在进程中，并且共享内存等)。
线程一般以并发执行，正是由于这种并发和数据共享机制，使多任务间的协作成为可能
协程 协程: 协程，又称微线程，纤程，英文名Coroutine。协程的作用，是在执行函数A时，可以随时中断，
去执行函数B，然后中断继续执行函数A（可以自由切换）
协程优点： 1.协程的切换开销更小，属于程序级别的切换，操作系统完全感知不到，因而更加轻量级
2.单线程内就可以实现并发的效果，最大限度地利用cpu
协程缺点： 1.无法利用多核资源：协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.
当然我们日常所编写的绝大部分应用都没有这个必要，除非是cpu密集型应用 2.协程指的是单个线程，因而一旦协程出现阻塞，将会阻塞整个线程
四大高阶函数 map 一般情况map()函数接收两个参数，一个函数（该函数接收一个参数），一个序列，将传入的函数依次作用到序列的每个元素，
并返回一个新的Iterator（迭代器）。
reduce 和map()用法类似，reduce把传入的函数作用在一个序列上，但传入的函数需要接收两个参数，
传入函数的计算结果继续和序列的下一个元素做累积计算
filter filter()同样接收一个函数和一个序列，然后把传入的函数依次作用于序列的每个元素，
如果传入的函数返回true则保留元素，否则丢弃，最终返回一个Iterator。
sorted sorted()函数就是用来排序的，同时可以自己定义排序的规则。
四大模式 设计模式概念与代码： Python设计模式 设计模式的定义:为了解决面向对象系统中重要和重复的设计封装在一起的一种代码实现框架,
可以使得代码更加易于扩展和调用
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod#定义抽象方法的关键字 def pay(self,money): pass # @abstractmethod # def pay(self,money): # raise NotImplementedError class AiliPay(Payment): #子类继承接口,必须实现接口中定义的抽象方法,否则不能实例化对象 def pay(self,money): print('使用支付宝支付%s元'%money) class ApplePay(Payment): def pay(self,money): print('使用苹果支付支付%s元'%money) 单例模式概念与代码： 定义:保证一个类只有一个实例,并提供一个访问它的全局访问点
  
  <div class="read-more-link">
    <a href="/my_technology_blog/and/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/one/">第一篇文章</a>
  </h1>
  <time datetime="2019-04-01T00:00:00Z" class="post-date">Mon, Apr 1, 2019</time>
  Django与Vue Django是一个开放源代码的Web应用框架，由Python写成。采用了MTV的框架模式，即模型M，视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的，即是CMS（内容管理系统）软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
框架介绍 Django 项目是一个Python定制框架，它源自一个在线新闻 Web 站点，于 2005 年以开源的形式被释放出来。Django 框架的核心组件有：
 用于创建模型的对象关系映射 为最终用户设计的完美管理界面 一流的 URL 设计 设计者友好的模板语言 缓存系统。  部署 一.django-admin startproject mysite # 创建mysite项目 django-admin startapp blog # 创建blog应用 一、接下来就是安装关于vue 的东西了
1、首先安装node.js，官网地址：https://nodejs.org/zh-cn/download/2、使用npm淘宝镜像，避免npm下载速度过慢的问题 npm install -g cnpm &ndash;registry=https://registry.npm.taobao.org
3、使用cnpm 下载vue-cli cnmp install -g @cue/cli
二.在django项目中创建vue项目 首先，进去django项目的项目目录中，执行：
vue init webpack firstvue## firstvue为前端项目的名称，可自定义。创建的项目会跟django中的app一样的目录登记。类似一个前端app一样。
mysite 文件夹 blog 文件夹 和 firstvue文件夹 要在同一目录级别
在创建时，会弹出很多选择项，根据自己需求自定义修改。也可以全部回车，使用默认的。这里我就直接全部回车。
三.编写vue前端项目
cd firstvue## 进入到上一部创建的firstvue项目中 cnpm install ## 安装需要的依赖模块 cnpm run dev ## 运行调式的服务，会启动一个web服务，访问localhost:8080 即可调式
  
  <div class="read-more-link">
    <a href="/my_technology_blog/one/">Read More…</a>
  </div>
  
</article><article class="post">
  <h1 class="post-title">
    <a href="/my_technology_blog/two/">第二篇文章</a>
  </h1>
  <time datetime="2002-04-02T00:00:00Z" class="post-date">Tue, Apr 2, 2002</time>
  序列化器 首先安装DRF
pip install djangorestframework # DRF是以Django扩展应用的方式提供的，所以我们可以直接利用已有的Django环境而无需从新创建。 #（若没有Django环境，需要先创建环境安装Django） # DRF需要以下依赖： # Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) # Django (1.10, 1.11, 2.0) 在django项目中注册rest_framework应用 在settings.py的INSTALLED_APPS中添加&rsquo;rest_framework&rsquo;
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'mdapp', # 子app 'rest_framework', #序列化 ] django中配置serializer序列化器 #序列化导包 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers redis设置过期时间 同一个ip一个时间点只能点击一次
# 导入redis import redis # 建立redis连接 r = redis.Redis(host='localhost') #本ip一小时添加一次浏览量 class showpl(APIView): def get(self, request): newsid = request.
  
  <div class="read-more-link">
    <a href="/my_technology_blog/two/">Read More…</a>
  </div>
  
</article>
</div>
    </main>

    
      
    
  </body>
</html>
